Die zusammengesetzten Datentypen waren die Einleitung zur ObjektOrientierten Programmierung (OOP). Doch was ist OOP?
Bei OOP geht es darum, dass unterschiedliche Objekte mit unterschiedlichen Eigenschaften erzeugt werden.
Das Prinzip ist, dass ein zu behandelndes Problem auf einige wenige, beherrschbare Eigenschaften und Operationen reduziert wird. Der erste Schritt ist die
Datenmodellierung: Es müssen alle Objekte und deren Eigenschaften gefunden werden, die benötigt werden, um das Problem zu lösen. Diese werden erst mal
nur Aufgelistet.
Nehmen wir ein Beispiel an einem realen Objekt, dimmbare Lampen. Eine solche Lampe hat folgende grundlegende Eigenschaften:
Und folgende Operationen, die man an ihr durchführen kann:
Hier einige Beispiele (die Bilder habe ich einfach mal von DALL-E genommen):
Schritt 2 ist es, einen allgemeinen Bauplan für Objekte dieser Art zu erstellen. Dieser wird in der OOP Klasse genannt. Mithilfe dieser Klasse können
später konkrete Objekte erzeugt werden.
In Java würde diese Klasse (= zusammengesetzter Datentyp) so aussehen:
Die Klasse hat die vier Eigenschaften, die wir vorhin definiert haben: String form
, Color farbe
, int maxLeuchtkraft
und int aktLeuchtkraft
und die beiden
Operationen heller()
und dunkler()
. Die maxLeuchtkraft
soll später nicht mehr verändert werden, darum hat sie noch das Schlüsselwort final
, was es zu einer
Konstante macht.
Nun da wir den 'Bauplan' für die Objekte haben, können wir diesen auch anwenden. In Java erzeugt man Objekte mit new
:
Wir rufen also nach dem new
den Konstruktor (public Lampe(String form, Color farbe, int maxLeuchtkraft)
) der Klasse auf und müssen diesem Werte für die angegebenen
Formalparameter mitgeben, damit dieser dann die Werte setzen kann. Dieser gibt uns zudem je das erzeugte Objekt zurück und wir können es in unsere Variablen
erdbeerLampe
und avocadoLampe
schreiben.
Ein Objekt beschreibt mit seinen Variablen einen gewissen Zustand, also was es jetzt gerade für Eigenschaften hat. Basierend auf diesen Eigenschaften
reagiert es unterschiedlich auf verschiedene Eingaben aus seiner Umwelt: Das Verhalten.
Das Verhalten wird durch die Operationen, also Unterprogramme, der Klasse definiert. Dieses Verhalten ist fast immer von dem aktuellen Zustand des Objekts abhängig,
da die Variablen des Objektes fast immer in den Operationen verwendet werden.
Im Beispiel von oben mit den Lampen wäre die resultierende Aktion des Objekts auf den Aufruf heller()
unterschiedlich, je nach dem, welchen Helligkeitswert die
Lampe derzeit hat und welchen maximalen Helligkeitswert die Lampe hat.
Jedes Objekt hat also je seine eigenen Eigenschaften (Variablenwerte). Die Unterprogramme werden jedoch nur ein einziges mal definiert: in der Klasse, die diese
Objekte erzeugt hat. Alle Objekte, die von der Klasse erzeugt werden, haben Zugriff auf die Unterprogramme.
Der Zustand eines Objektes wird ja durch die zugehörigen Variablen beschrieben. Im Optimalfall ist die Veränderung der Eigenschaften der Objekte nur durch Unterprogramme
(Operationen) möglich. Dies ist aber nur dann gewährleistet, wenn die Variablen auch auf private
gesetzt sind, ansonsten (z.B. mit public
) können externe Objekte
nach belieben auf diese zugreifen und die Werte verändern. Damit würde das Geheimnisprinzip verletzt werden. Also: Alles was möglich ist, auf private
setzen.
Ein essenzieller Teil der OOP ist, dass sich Objekte untereinander kennen können. Dies kann dadurch passieren, dass dank call by reference die Referenz zu einem Objekt
als Parameter in ein anderes Objekt übergeben wird. In einem Klassen-/ Objektdiagramm wird dies durch Pfeile zwischen den Klassen/Objekten signalisiert.
Hier ein Beispiel mit zwei Klassen, deren Objekte sich untereinander kennen können sollen:
Sobald man in diesem Beispiel mit new Steuerung()
ein neues Steuerungsobjekt erzeugt, wird eine neue Gui erzeugt, die einen Parameter erwartet: Ein Steuerungsobjekt.
Das soll es auch bekommen: Mit this
geben wir das Objekt mit, in dem wir uns gerade befinden, also in dem Steuerungsobjekt. In der Gui wird dieses Objekt dann in die
entsprechende Variable steuerung
geschrieben.
Nun haben wir in beiden Klassen ein Objekt, das je zum anderen zeigt und haben damit eine Verbindung zwischen den Objekten erzeugt, denn mit diesen Variablen kann nun
auf die Operationen des je anderen Objektes zugegriffen werden.
Dies ist eines der Grundkonzepten der OOP und essentiell zum weiteren Programmieren mit mehreren Klassen.
Frage 1
Wofür steht OOP? Worum geht es dabei?
Frage 2
Im Beispiel mit den Lampen oben wird die Klasse Color
verwendet. Wie könnte eine grundlegende implementierung dieser mit Konstruktor und Gettern aussehen?
Frage 3
Wie kann man eine Verknüpfung zwischen zwei Objekten herstellen?
Frage 4
Erstelle eine Klasse Film
, die den Filmtitel, Beschreibung und bis zu 10 Bewertungstexten enthält und entsprechende Getter und Setter hat.
Der Titel soll nicht mehr verändert werden.
Die Bewertungen sollen nicht mehr gelöscht werden, aber es können jederzeit neue dazukommen. Zu Beginn gibt es noch keine Bewertungen.